package week8;

/**
 * Speler. Abstracte klasse voor het bijhouden van een Speler 
 * in het Boter-Kaas-Eieren spel.
 * Practicumopdracht P1.
 * @author  Theo Ruys en Arend Rensink
 * @version $Revision: 1.4 $
 */
public abstract class Speler {

    // -- Instance variables -----------------------------------------

    private String naam;
    private Mark   mark;

    // -- Constructors -----------------------------------------------

    /**
     * Construeert een nieuw Speler object.
     * @require <code>naam != null</code> <br>
     *          <code>mark == Bord.XX | Bord.OO</code>
     * @ensure  <code>this.getNaam() == naam</code><br>
     *          <code>this.getMark() == mark</code><br>
     */
    public Speler(String naam, Mark mark) {
        this.naam = naam;
        this.mark = mark;
    }

    // -- Queries ----------------------------------------------------

    /**
     * Levert de naam van deze Speler.
     */
    protected String getNaam() {
        return naam;
    }

    /**
     * Levert de markering van deze Speler.
     */
    protected Mark getMark() {
        return mark;
    }

    /**
     * Bepaalt het vakje voor de volgende zet.
     * @require <code>bord != null && !bord.isVol()</code>
     * @ensure  <code>bord.isVakje(result) && bord.isLeegVakje(result)</code>
     * @param   bord het spelersbord
     * @return  keuze van het vakje van deze Speler
     */
    public abstract int bepaalZet(Bord bord);

    // -- Commands ---------------------------------------------------

    /**
     * Doet een zet op het bord. <br>
     * @require <code>bord != null && !bord.isVol()</code>
     * @param   bord het huidige speelbord.
     */
    public void doeZet(Bord bord) {
        int keuze = bepaalZet(bord);
        bord.setVakje(keuze, getMark());
    }

} // end of class Speler


